温故而知新 最近在家 又把注释理解添加一遍 按照初学的水平做到注释 很多人说注释做到不规范,这个正常 因为我连规范是什么都不清楚 只当又做了一次笔记
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h> //intrins.h,函数,应用于程序设计,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用。
- //crol_ 字符循环左移
- //_cror_ 字符循环右移
- //_irol_ 整数循环左移
- //_iror_ 整数循环右移
- //_lrol_ 长整数循环左移
- //_lror_ 长整数循环右移
- //_nop_ 空操作 (相当于8051 NOP 指令)
- //_testbit_ 测试并清零位 (相当于8051 JBC 指令)
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^6;
- sbit RW=P2^5;
- sbit EN=P2^7;
- uchar code dis2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //1-9
- uchar code p[]="-";//code 可以不加,加了之后就是固定了这个数组不能对其进行操作、、这个一定要注意。。。
- uchar j,k,kk,miao,miao1,fen,fen1,shi,shi1;
- void delay_ms(int x)//延时程序,延时1ms
- {
- uint i;
- while(x--)
- for(i=0;i<120;i++);
- }
- uchar busy()//对LCD1602 判断是否忙
- {
- uchar status; //声明函数status
- RS=0; //读内部寄存器状态算是读指令选择 RS=0指令选择
- RW=1; //读操作
- EN=1;//使能信号也就是开始工作的意思 ,读操作一直高电平,写操作只是高脉冲
- delay_ms(1);
- status=P0; //status是子函数声明的函数入口函数定义为P0,就是说p0是数据口 00-07 8个端子要是07是高电位就是1602忙碌 07是低电平就是闲,status是子函数声明的函数入口
- EN=0; //读操作完成 拉低使能信号,为下次工作做准备
- return status; //return 返回函数 读取完P0口数据返回主函数
- }
-
- void write_cmd(uchar cmd)//写命令程序,首先对其进行判忙
- {
- while((busy()&0x80)==0x80);//对返回进行或运算判断全1则1,如果为忙就进行等待
- RS=0; //命令选择
- RW=0; //写操作
- EN=0;// 片选信号拉低准备工作
- P0=cmd; //函数cmd的数据放到P0上
- EN=1; //片选信号开始工作
- delay_ms(1);
- EN=0;//拉低片选为下次做准备
- }
- void write_data(uchar dat) //写数据函数函数dat
- {
- while((busy()&0x80)==0x80); //忙判断 或-全1则1
- RS=1; //数据选择
- RW=0; //写操作
- EN=0; //片选信号
- P0=dat; //P0读取dat
- EN=1; //开始传送
- delay_ms(1);
- EN=0; //拉低片选信号
- }
- void canshu() //初始化1602函数 百度一大把
- {
- write_cmd(0x38); //写命令函数 命令数据0X38=111000,初始化设置16*2显示 5*7点阵,8为数据接口
- delay_ms(1);
- write_cmd(0x01);//清屏
- delay_ms(1);
- write_cmd(0x06);//指针自动加1
- delay_ms(1);
- write_cmd(0x0c);//开光标显示 不显示
- delay_ms(1);
- }
- *****************************************************************************
- 这里没有数据地址命令 因为数据地址再别的函数里面给定
- ********************************************************************************
- /*void xianshi(uchar x,uchar y,uchar *str) //*str是指针字符串的指针,xy可能是数据指针函数
- {
- uint i=0; //声明函数i并且赋值0
- if(y==0) //当函数y=0时 为真 可能是写在第一行的意思
- write_cmd(0x80|x); //执行命令x和0x80(1000 0000)相与 全1是1得出命令 执行
- if(y==1) //当函数y=1时 为真 可能是写在第二行的意思
- write_cmd(0xc0|x); //执行命令x和0xc0(1100 0000|x)相与 全1是1得出命令 执行 0xc0=0x80+0x40
- for(i=0;i<16;i++) //i值循环增加 不知所云
- {
- write_data(str[i]); //*str是指针字符串的指针,
- //str[i]的意思可能是把i变成字符串 当数据执行 出自百度介绍 不是很懂
- if(p=='\0') //字符串判断结束标志 如果p的ascii码为0 好像是把一个字符串赋值给数组:u8 str1[]={"0000.0000.000"};
- //实际上数组str1在内存中的实际存放情况为:
- // '\0'出自百度 介绍
- //这后面的'\0'是由C编译系统自动加上的。所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
- break;
- }
- } */ 8*******************************************************
- 废函数卧槽 刚发现源程序这个子函数开头有斜杠 是个废函数
-
- **************************************************************
- void aaa() interrupt 1 //定时器aaa函数中断入口1
- {
- TH0=(65535-50000)/256; //50ms一中断
- TL0=(65535-50000)%256;
- if(++kk==40) //****************k先+在判断是否=40 kk可能是中断函数 先++在计算是为了从0开始计数 后++可能从1 开始 语法格式等同于 ++kk
- ********************kk是全局变量 if(k=40)
- {
- miao++; //********************kk中断40次时间秒自加1
-
- if(miao==10) //当个位=10
- {
- if(miao1++==5) //miao1 自加一次 直到5次以后秒数达到59 后条件导通程序往下一步走
- {
- if(fen++==10)
- {
- if(fen1++==5)
- {
- if(shi++==10)
- {
-
- if(shi1++==1)
- {
- shi1=0;
- shi=0;
- }
-
- shi=0;
- }
- fen1=0;
- }
- fen=0;
- }
- miao1=0;
- }
- miao=0;
- }
- kk=0;
- }
- }
- void main()
- {
- P1=0x00;//我自己加的 要不然 开机显示小黑块 前一个帖子 有介绍 理由参照6800开发板原理图
- P2=0X06; //同上
- canshu();// //初始化1602函数 百度一大把
- xianshi(0,0,p);//子函数 没用 //
- xianshi(0,1,p+16);// 子函数 没用
- EA=1;
-
- ET0=1;
- TMOD=0x01;
- TH0=(65535-50000)/256;//如果不准可对其进行修改,比如4000可能更准确 TL0=(65535-50000)%256;
- TL0=(65535-50000)%256; TR0=1;
- while(1)
- {
- write_cmd(0x80|1); //*********************1000 0001 相与有1则一 这个是时的位置 光标起始位置加一是小时十位的位置
-
- write_data(dis2[shi]); //************* //dis2[]1-9数组名字 这个是时的显示
-
- write_data写数据函数 数据内容是数组dis2(全局变量)
-
- shi也是全局变量 shi=1 显示数组第一个字符1
-
-
- write_cmd(0x80|2);//10000010 也就是十六进制0x82代表时的个位显示位置
-
- write_data(dis2[shi1]);//1-9数组选择小时的个位
-
- write_cmd(0x80|3);//地址0x83 在这个地址上写
-
- write_data(p[0]);//数据为第二个数组的0位 这个数组就一个-符号
- write_cmd(0x80|4); //地址0x84 也就是分的十位
-
- write_data(dis2[fen1]); //写数据函数 写数组制定数据到分的十位
-
- write_cmd(0x80|5);//以下类同
-
- write_data(dis2[fen]);
-
- write_cmd(0x80|6);
-
- write_data(p[0]);
- write_cmd(0x80|7);
-
- write_data(dis2[miao1]);
- write_cmd(0x80|8);
- write_data(dis2[miao]);
- }
- }
复制代码
|