历史上的今天
今天是:2024年10月15日(星期二)
2019年10月15日 | ATMEGA16A单片机1602字符显示程序
2019-10-15 来源:eefocus
* 【编译环境】: ICCAVR
* 【函数功能】: 1602字符显示
* 【晶 振】: 8M
* 【芯 片】: ATMEGA16A
#include #define uchar unsigned char #define uint unsigned int uchar wz[]={"mcustudio1com-cn"}; uchar gd[]={"Tel:15980xx5601"}; #define uchar unsigned char #define uint unsigned int #define RS 0 #define RW 1 #define EN 2 void s_ms(uint ms) { for(;ms>1;ms--); } //查忙 void busy(void) { uchar temp; s_ms(500); PORTA&=~(1< PORTA|=(1< while(temp) { PORTA|=(1< DDRB=0x00; //A口变输入 PORTB=0xff; //上拉使能 s_ms(500); temp = PINB&0x80; //读取A口 s_ms(500); DDRB=0xff; PORTB=0xff; //A口变输出 s_ms(500); PORTA&=~(1< } } //写指令 void writecom(uchar com) { busy(); s_ms(500); PORTA&=~(1< PORTA&=~(1< PORTA|=(1< PORTB = com; //输出指令 s_ms(500); PORTA&=~(1< } //1602初始化 void LcdInit(void) { DDRB = 0xff; PORTB = 0x00; writecom(0x38); s_ms(1000); writecom(0x01); s_ms(1000); s_ms(1000); s_ms(1000); s_ms(1000); s_ms(1000); s_ms(1000); s_ms(1000); writecom(0x02); s_ms(1000); writecom(0x06); s_ms(1000); writecom(0x0c); s_ms(1000); writecom(0x38); s_ms(1000); } //写数据 void writedata(uchar data) { busy(); s_ms(500); PORTA|=(1< PORTA&=~(1< PORTA|=(1< PORTB = data; //输出数据 s_ms(500); PORTA&=~(1< } //读数据 uchar readdata(void) { uchar temp; busy(); s_ms(500); PORTA|=(1< PORTA|=(1< PORTA|=(1< DDRB=0x00; //A端口变输入 s_ms(500); temp = PINB; //读A端口 s_ms(500); DDRB=0xff; //A端口变输出 s_ms(500); PORTA&=~(1< return temp; } //================================================= // 描述: 写LCD内部CGRAM函数 // 入口: ‘num’要写的数据个数 // ‘pbuffer’要写的数据的首地址 // 出口: 无 //================================================ void WriteCGRAM(uint num, const uint *pBuffer) { uint i,t; writecom(0x40); PORTA|=(1< { t = *pBuffer; PORTA|=(1< PORTA&=~(1< } } //================================================= //描述:写菜单函数,本程序使用的LCD规格为 16 * 2 //入口:菜单数组首地址 //出口:无 //================================================= void WriteMenu(const uchar *pBuffer) { uchar i,t; writecom(0x80); //数据地址 PORTA|=(1< for(i=0;i<16;i++) { t = *pBuffer; PORTB = t; PORTA|=(1< PORTA&=~(1< } writecom(0xC0); PORTA|=(1< for(i=0;i<16;i++) { t = *pBuffer; PORTB = t; PORTA|=(1< PORTA&=~(1< } } //==================================================== // 描述:在任意位置写数字函数 // 入口:’row‘表示要写数字所在的行地址,只能为1或2 // ’col‘表示要写数字所在的列地址,只能为0--15 // ‘num’表示要写的数字,只能为0--9 // 出口:无 //=================================================== void WriteNum(uint row,uint col,uint num) { if (row == 1) row = 0x80 + col; else row = 0xC0 + col; writecom(row); if (num<=0 | num>9) num =0x30; else num = 0x30 + num; PORTA|=(1< PORTA&=~(1< PORTB = num; s_ms(500); PORTA|=(1< PORTA&=~(1< } //================================================================ // 描述:在任意位置写任意多个字符 // 入口:’row‘要写的字符所在的行,只能为1或2; // ‘col’要写的字符所在的列,只能为0---15 // ‘num’要写字符的个数
史海拾趣
|
报销单是公司测试你的一个工具 看到这个题目或许你会纳闷?报销单也能测试员工?是的,我们平时不以为常的报销单也是公司或领导测试你的一个工具。 大部分公司都会有月底报销(餐费、交通费、电话费等)或出差报销吧? ...… 查看全部问答> |
|
在嵌入式系统中中断相关寄存器 常有 一个中断使能寄存器和一个中断屏蔽寄存器 一个是使能相应位,一个是屏蔽相应位;请问这两个寄存器的实现的作用一样吗?为什么用两个而不只用一个寄存器来实现 中断 使能/屏蔽 功能呢? … 查看全部问答> |
|
u-boot-2010.03在tq6410上的移植详解(连载) http://bbs.embedsky.net/viewthread.php?tid=6761&extra=page%3D1 (一) 原创文章版权所有!如需转载,请注明出处: http://hi.baidu.com/liushuiyue1/myhome谢谢合作!!!!!由于Uboot2010.03对S3C6410有了很好的支持,所以采用Uboot201 ...… 查看全部问答> |
|
while(1) { while((USART1->SR & 0x80)==0); //检查发送缓冲器是否为空 USART1->DR=0x0012; //写进数据寄存器的数据 while((USART1->SR & 0x40)== ...… 查看全部问答> |
|
由树莓派引发的卡片电脑热潮,国内嵌入式开发商也纷纷开发体积小的卡片电脑。国内著名嵌入式开发也开发卡片电脑。现在,将对天嵌的E8卡片电脑与OK335xS-II开发板进行基本参数的对比。 基本参数对比: 基本参数 ...… 查看全部问答> |
|
刚才登错朋友的账号,把文章发出去了,现在再写一篇 得知自己得到了参团购买STM32 Nucleo-L053R8感到很高兴,等待了几十天,板子终于到了,在网上了解到stm32l053是ST新出的一款低功耗的MCU,所以坤函数 ...… 查看全部问答> |




