【51单片机点阵显示数字和汉字,定时器20毫秒刷新一次】2021-11-18

缘由单片机点阵显示数字和汉字,定时器20毫秒刷新一次-嵌入式-CSDN问答

#include<reg52.h>//头文件
//unsigned char js=0;
bit k=0;
unsigned char code CHARCODE[21][8]={
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, /*0*/{0x00,0x00,0x21,0x7f,0x01,0x00,0x00,0x00}, /*1*/
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, /*2*/{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, /*3*/
{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, /*4*/{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, /*5*/
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, /*6*/{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, /*7*/
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, /*8*/{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, /*9*/
{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, /*P*/{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, /*R*/
{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, /*E*/{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, /*C*/
{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, /*H*/{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, /*I*/
{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, /*N*/{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00}, /*中*/
{0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}, //方形
{0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00}, //铜钱形
{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00} //三角形
};
void ZhongDuanSheZhi()
{
	TH0+=0Xf7;/*定时器赋初值,定时2.5ms触发中断,自动补偿方式*/
	TL0+=0X00; 
	TMOD=0X01;
	TR0=1;
	ET0=1; //开启定时器
	EA=1; //全局中断开关
}
void main()
{
	unsigned char wei=0,Xd=0,ww=0,zt=0, ys=0;
	ZhongDuanSheZhi();
	while(1)
	{
		if(k)//20毫秒刷新
		{
			P2=CHARCODE[wei][7-Xd];
			if(!(ww*=2))++ww;
			P3=~ww;
			while(++ys);P3=255;
			if(++Xd>7){Xd=0;++zt;}
			k=0;
		}
		if(zt>40)//切换速度
		{
			zt=0;
			if(++wei>20)wei=0;
		}
	}
}
void ZhongDuan() interrupt 1
{
	k=1;
	TH0=0Xf7;
	TL0=0X00;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STC89C52单片机的代码,可以使用hc-sr04和lcd1602模块测量距离并显示: ``` #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit trig = P3^3; //定义超声波发射引脚 sbit echo = P3^2; //定义超声波接收引脚 void delay_us(uint i) //微秒延时函数 { while(i--) { _nop_(); //空操作指令 } } void delay_ms(uint i) //毫秒延时函数 { uchar j; while(i--) { for(j = 0; j < 120; j++); } } void write_com(uchar com) //写入命令函数 { P0 = com; //将命令写入P0口 P2 &= ~0x01; //RS=0,选择命令寄存器 P2 &= ~0x04; //RW=0,选择写入模式 P2 |= 0x08; //E=1,启动液晶屏 delay_us(5); P2 &= ~0x08; //E=0,停止液晶屏 } void write_data(uchar dat) //写入数据函数 { P0 = dat; //将数据写入P0口 P2 |= 0x01; //RS=1,选择数据寄存器 P2 &= ~0x04; //RW=0,选择写入模式 P2 |= 0x08; //E=1,启动液晶屏 delay_us(5); P2 &= ~0x08; //E=0,停止液晶屏 } void init_lcd() //初始化液晶屏函数 { write_com(0x38); //8位数据总线,2行显示,5x7点阵字符 write_com(0x0c); //开启显示,光标隐藏 write_com(0x06); //文字不动,光标自动移动 write_com(0x01); //清屏 } void display_distance(uint dis) //显示距离函数 { uchar i; uchar str[6] = {0}; //定义字符数组 sprintf(str, "%d", dis); //将距离转换成字符串 for(i = 0; i < 6; i++) //循环显示字符 { if(str[i] != '\0') //如果字符不为空 { write_data(str[i]); //将字符写入液晶屏 } } } uint get_distance() //获取距离函数 { uint distance; //定义距离变量 trig = 0; //将触发引脚设为低电平 delay_us(2); trig = 1; //将触发引脚设为高电平 delay_us(10); trig = 0; //将触发引脚设为低电平 while(!echo); //等待接收引脚变为高电平 TL1 = 0; //清空定时器1低8位 TH1 = 0; //清空定时器1高8位 TR1 = 1; //启动定时器1 while(echo); //等待接收引脚变为低电平 TR1 = 0; //停止定时器1 distance = (TL1 + TH1 * 256) / 58; //计算距离 return distance; //返回距离值 } void main() { uint distance; //定义距离变量 init_lcd(); //初始化液晶屏 while(1) { distance = get_distance(); //获取距离值 write_com(0x80); //显示距离 write_data('D'); write_data('i'); write_data('s'); write_data('t'); write_data('a'); write_data('n'); write_data('c'); write_data('e'); write_data(':'); display_distance(distance); //显示距离值 delay_ms(500); //延时0.5秒 } } ``` 注:以上代码仅供参考,请根据具体情况进行修改和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值