计数器C程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

calculate();
switch(x)
// 数据的更新
{
case 2: a0=dis_buf;a1=0x20;
break;
case 3: a1=a0;a0=dis_buf;
break;
}
display();
dis_buf=240;
// 执行完一次键值后重新给
键值 240
}
}
}
void calculate()
0xe7,0xd7,0xb7,0x77}; //3*4 矩阵接键,分别显示 1234567890AB
sbit EN=P2^7; //1602 使能控制线 sbit RS=P2^6; //1602 数据/指令选择控制线 sbit RW=P2^5; //1602 读写控制线
/**延时处理程序,单位 ms**/ void delayms (uint ms) {
//设置 LCD 为 16X2 显示,5X7 点阵,八位数据接口 //LCD 显示光标移动设置(光标地址指针加 1,整屏显示不移动) //LCD 开显示及光标设置(光标不闪烁,不显示"_") //清除 LCD 的显示内容
/**按键扫描程序**/ void keyscan() {
uchar scan1,scan2,keycode,j,key; P1=0xf0; scan1=P1; if(scan1!=0xf0) {
//键值入显示缓存 //转换为 ASCII 码
//判断是否按键已经按下
// 没有按键按下的时候给 dis_buf 为 240
/**主函数**/
void main()
{
lcdint();
while(1)
{
keyscan();
if(dis_buf!=240)
// 当有键按下的时候
{
x=x+1;
// 每按下一次键更新一次显示
do{ EN=0; RS=0; RW=1; PORT=0xff; EN=1; _nop_(); }
while(PORT&0x80); EN=0;
}
/**1602 写命令函数**/ void lcdwcmd(uchar cmd) {
lcdbusy(); RS=0; RW=0; EN=1; PORT=cmd; EN=0; }
* 实验说明: 1.由于按键的个数有限只开通了加法运算
*
*
2.a 键为“+”运算,b 键为“=”
*
*
3.只开通了 2 位数的运算
*
*
4.按键规则先按下加数再按“+”再被加数再“=”
*
* 接线方法: Jp8 连 JP4
*
*****************************************************************************/
void display();
void display1();
void calculate();
uchar a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
uchar code key_code[]={0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,
{ uchar i;
if(dis_buf==0x41)
//当按键的码值是 0x40(键盘上的 a 键)
{
lcdpos(1,0);
// 则在下面一行的开始显示“+”
lcdwdata(0x2b);
display1();
// 上一组数据全部搬到上面一行显示
if(a1==0x20) a1=0x30;
//如果加数是一位数则十位默认为 0
delayms(10); scan1=P1; if(scan1!=0xf0) { P1=0xff; P1=0x0f;
scan2=P1; keycode=scan1|scan2; for(j=0;j<12;j++) { if(keycode==key_code[j]) {
key=j; dis_buf=key; dis_buf=dis_buf&0x0f; if(dis_buf>9) dis_buf=dis_buf+0x37; else dis_buf=dis_buf+0x30; P1=0xf0; while(P1!=0xf0); } } } else dis_buf=240; } }
date1=(a0-0x30)+(a1-0x30)*10; //计算第一个数的数值
a0=0x20;a1=0x20;
x=1;
}
if(dis_buf==0x42)
// 当按键的码值是 0x42(键盘上的 b 键)
{
lcdpos(1,0);
// 则在下面一行的开始显示“=”
lcdwdata(0x3d);
if(a1==0x20) a1=0x30;
//个
lcdpos(1,1); for(i=0;i<=2;i++) lcdwdata(shuzu[i]); x=0; } } /**显示程序 1(在 1602 下面一行显示)**/ void display() { lcdpos(1,15); lcdwdata(a0);
// 把加得的数显示在“+”后面
0<=x<16
else lcdwcmd(y|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}
/**1602 初使化**/ void lcdint() {
lcdwcmd(0x38); lcdwcmd(0x0c); lcdwcmd(0x06); lcdwcmd(0x01); }
/*****************************************************************************
*标题:
试验 lcd1602 显示遥控键值
*
*作者:龙的传人
*
*公司:普中科技
*
*论坛:www.prechin.net
*
******************************************************************************
uint i; while(ms--) {
//for(i=0;i<112;i++) //11.0592M 晶体 for(i=0;i<120;i++) //12M 晶体 {;} } }
//*****lcd1602 驱动******//
/**1602 忙状态检测**/ void lcdbusy() {
#include <reg52.h>
#include <intrins.h>
#define PORT P0
#define uint unsigned int
#define uchar unsigned char
uint shuzu[4];
uchar dis_buf,a,x;
unsigned long date,date1,date2;
//如果被加数是一位数则十位默认为 0
date2=(a0-0x30)+(a1-0x30)*10; //计算第二个数的数值
date=date1+date2;
// 两个数相加
shuzu[0]=date%1000/100+0x30;
//百位
shuzu[1]=date%100/10+0x30; //十位
sቤተ መጻሕፍቲ ባይዱuzu[2]=date%10+0x30;
/**1602 写数据函数**/ void lcdwdata(uchar dat) {
lcdbusy(); RS=1; RW=0; EN=1; PORT=dat; EN=0; }
/**LCD 数据指针位置程序**/
void lcdpos(bit x, uchar y)
{
if(x)lcdwcmd(y|0xc0); //x=1,第二行显示;x=0,第一行显示
lcdpos(1,14); lcdwdata(a1);
} /**显示程序 2(在上面一行显示)**/
void display1() {
lcdpos(0,15); lcdwdata(a0);
lcdpos(0,14); lcdwdata(a1);
}
相关文档
最新文档