第一次学Arduino......
还没有购买开发板
一般都在Proteus上进行
51单片机:http://www.51hei.com/bbs/dpj-114268-1.html
整体电路图
效果图
效果图
单片机代码如下:
- //引脚定义
- #define LCD1602_SHCP 0
- #define LCD1602_DS 1
- #define LCD1602_STCP 2
- //两种数据类型
- typedef unsigned char uchar;
- typedef unsigned int uint;
- //定义数据槽
- uchar RS,RW,E,D4,D5,D6,D7;
- //二进制的形象表示方法,从左到右分别位第7 6 5 4 3 2 1 0位
- #define bin(_a,_b,_c,_d,_e,_f,_g,_h) ((_a)<<7|(_b)<<6|(_c)<<5|(_d)<<4|(_e)<<3|(_f)<<2|(_g)<<1|(_h)) //二进制的表示
- void LCD1602_DATAPINS(uchar value); //更改74HC595连接LCD1602的数据
- void LcdCalc(uchar i); //确定4位总线
- void LcdWriteCom(uchar com); //向LCD写入一个字节的命令
- void LcdWriteData(uchar dat); //向LCD写入一个字节的数据
- void LcdInit(); //初始化LCD屏
- void LcdPrintf(uchar *s); //向屏幕输出字符
- void LcdWriteCGRAM(uchar index,uchar *p); //建立一个自定义字符
- void LCDPrintNum(uint num,uchar wei); //显示数字
- /*******************************************************************************
- * 函 数 名 : setup
- * 函数功能 : 准备
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void setup()
- {
- pinMode(LCD1602_SHCP,OUTPUT);
- pinMode(LCD1602_DS,OUTPUT);
- pinMode(LCD1602_STCP,OUTPUT);
- }
- /*******************************************************************************
- * 函 数 名 : LCD1602_DATAPINS
- * 函数功能 : 更改74HC595连接LCD1602的数据
- * 输 入 : value
- * 输 出 : 无
- *******************************************************************************/
- void LCD1602_DATAPINS(uchar value)
- {
- uchar i,j;
- for(i=0;i<8;i++)
- {
- j=value&0x80;//取数据高位
- if(j==0x80){ //判断数据高位是否为1
- digitalWrite(LCD1602_DS,HIGH);//如果高位为1,DS置1
- }
- else{
- digitalWrite(LCD1602_DS,LOW);//否则DS置0
- }
- digitalWrite(LCD1602_SHCP,LOW);
- digitalWrite(LCD1602_SHCP,HIGH);//上升沿使这一位写入移位寄存器
- value<<=1;//数据左移1位,数据的第7位变为最高位,循环第8次时数据的最低位也变成最高位
- }
- digitalWrite(LCD1602_STCP,LOW);
- digitalWrite(LCD1602_STCP,HIGH);//给STCP一个上升沿,将for循环中输入的数据移入输出锁存寄存器,刷新输出数据
- }
- /*******************************************************************************
- * 函 数 名 : LcdCalc
- * 函数功能 : 确定4位总线
- * 输 入 : i
- * 输 出 : 无
- *******************************************************************************/
- void LcdCalc(uchar i)
- {
- if(i==0x00){
- D4=0;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x01){
- D4=1;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x02){
- D4=0;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x03){
- D4=1;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x04){
- D4=0;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x05){
- D4=1;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x06){
- D4=0;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x07){
- D4=1;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x08){
- D4=0;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x09){
- D4=1;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x0a){
- D4=0;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0x0b){
- D4=1;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0x0c){
- D4=0;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0x0d){
- D4=1;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0x0e){
- D4=0;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0x0f){
- D4=1;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0x10){
- D4=1;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x20){
- D4=0;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x30){
- D4=1;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x40){
- D4=0;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x50){
- D4=1;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x60){
- D4=0;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x70){
- D4=1;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x80){
- D4=0;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x90){
- D4=1;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0xa0){
- D4=0;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0xb0){
- D4=1;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0xc0){
- D4=0;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0xd0){
- D4=1;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0xe0){
- D4=0;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0xf0){
- D4=1;
- D5=1;
- D6=1;
- D7=1;
- }
- }
- /*******************************************************************************
- * 函 数 名 : LcdWriteCom
- * 函数功能 : 向LCD写入一个字节的命令
- * 输 入 : com
- * 输 出 : 无
- *******************************************************************************/
- void LcdWriteCom(uchar com) //写入命令
- {
- E = 0; //使能清零
- RS = 0; //选择写入命令
- RW = 0; //选择写入
- LcdCalc(com>>4); //发送高四位
- E = 1; //写入时序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- LcdCalc(com<<4); //发送低四位
- E = 1; //写入时序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- }
- /****************************************************************************
- * 函 数 名 : LcdWriteData
- * 函数功能 : 向LCD写入一个字节的数据
- * 输 入 : dat
- * 输 出 : 无
- *******************************************************************************/
- void LcdWriteData(uchar dat) //写入数据
- {
- E = 0; //使能清零
- RS = 1; //选择写入数据
- RW = 0; //选择写入
- LcdCalc(dat>>4); //发送高四位
- E = 1; //写入时序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- LcdCalc(dat<<4); //发送低四位
- E = 1; //写入时序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS));
- }
- /*******************************************************************************
- * 函 数 名 : LcdInit
- * 函数功能 : 初始化LCD屏
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x32); //将8位总线转为4位总线
- LcdWriteCom(0x28); //在四位线下的初始化
- LcdWriteCom(0x0c); //开显示不显示光标
- LcdWriteCom(0x06); //写一个指针加1
- LcdWriteCom(0x01); //清屏
- LcdWriteCom(0x80); //设置数据指针起点
- }
- /*******************************************************************************
- * 函 数 名 : LcdPrintf
- * 函数功能 : 向屏幕输出字符
- * 输 入 : *s
- * 输 出 : 无
- *******************************************************************************/
- void LcdPrintf(uchar *s)
- {
- while(*s>0)LcdWriteData(*s++);
- }
- /*******************************************************************************
- * 函 数 名 : LcdWriteCGRAM
- * 函数功能 : 建立一个自定义字符
- * 输 入 : index、*p
- * 输 出 : 无
- *******************************************************************************/
- void LcdWriteCGRAM(uchar index,uchar *p)
- {
- uchar i;
- index <<=3; //index *= 8
- for(i=0;i<8;++i){
- LcdWriteCom(0x40 | index+i);//写CGRAM地址
- LcdWriteData(*p++);
- }
- LcdWriteCom(0x80);
- }
- /*******************************************************************************
- * 函 数 名 : LcdPrintNum
- * 函数功能 : 显示数字
- * 输 入 : num、wei
- * 输 出 : 无
- *******************************************************************************/
- void LCDPrintNum(uint num,uchar wei)//wei 数字占的位数
- {
- uchar tempstring[6];
- uchar n[5];
- uchar i,j=0;
- n[0]=num/10000;
- n[1]=num%10000/1000;
- n[2]=num%1000/100;
- n[3]=num%100/10;
- n[4]=num%10;
- i=5-wei;
- for(i;i<5;i++){
- tempstring[j++]=n[i]+'0';
- }
- tempstring[j]='\0';
- LcdPrintf(tempstring);
- }
- const uchar type_t[]={
- 0x1f,0x02,0x02,0x02,
- 0x02,0x02,0x02,0x00
- };
- const uchar line1[]="Have a nice day!";
- const uchar line2[]="HE Wcommands";
- void loop()
- {
- uchar i;
- LcdInit();
- LcdWriteCGRAM(0x00,type_t);
- LcdWriteData(0x00);
- LcdWriteCom(0x81);
- LcdPrintf("HE With");
- LcdWriteCom(0xc0);
- LcdPrintf("Commands");
- delay(100);
- LcdWriteCom(0x01);
- while(1){
- for(i=0;i<16;i++){
- LcdWriteCom(0x80+i);
- LcdWriteData(line1[i]);
- delay(5);
- }
- delay(10);
- LcdWriteCom(0xc1);
- LcdWriteData(0x00);
- delay(5);
- for(i=0;i<12;i++){
- LcdWriteCom(0xc2+i);
- LcdWriteData(line2[i]);
- delay(5);
- }
- LcdWriteCom(0x01);
- delay(5);
- }
- }
复制代码
全部资料51hei下载地址:
lcd595.zip
(27.79 KB, 下载次数: 31)
|