4*4矩阵键盘输入1602显示1-16,怎么9之后显示“:<;”之类的符号,没有显示10之后的数字

我要做的是电梯语音播报(语音先不管,先做键盘显示的仿真),按下键之后会对应显示1-16的数字,
问题:
4*4矩阵键盘输入1602显示1-16的数字,能显示数字,但9之后显示“:<;”之类的符号,没有显示10之后的数字
请问下我这程序怎么改才能显示两位数,或者帮我设计个两个一位数码管的电路及程序显示两位数 。用最好用C语言编写。
我没学好,是个小白最好说仔细点好。先谢谢了。我邮箱是718610880@qq.com
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
uchar a;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_cmd(uchar cmd)
{
lcden=0;
lcdrs=0;
lcdrw=0;
P0=cmd;
_nop_();
lcden=1;
delay(1);
lcden=0;
_nop_();
}
void write_dat(uchar dat)
{
lcden=0;
lcdrs=1;
P0=dat;
_nop_();
lcden=1;
delay(1);
lcden=0;
_nop_();
}
void lcdint()
{
lcden=0;
write_cmd(0x38);
write_cmd(0x0c);
write_cmd(0x06);
write_cmd(0x01);
}
void delayms(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=112;y>0;y--);
}
char keyscan()
{
uchar key_l,key_h,key;
P3=0xf0;
key_l=P3;
key_l=key_l&0xf0;
if(key_l!=0xf0)
{
delayms(50);
if(key_l!=0xf0) //假设检测到0
{
key_l=P3&0xf0; //读取高4位 11100000
key_l=key_l|0x0f; //低4位写1 11101111
P3=key_l; //针对第一列
key_h=P3; //11101110
key_h=key_h&0x0f;//屏蔽高四位 00001110
key_l=key_l&0xf0; //去掉低4位 11100000
key=key_h+key_l; //11101110
}
}
switch(key)
{
case 0xee: a=1;break;
case 0xde: a=2;break;
case 0xbe: a=3;break;
case 0x7e: a=4;break;
case 0xed: a=5;break;
case 0xdd: a=6;break;
case 0xbd: a=7;break;
case 0x7d: a=8;break;
case 0xeb: a=9;break;
case 0xdb: a=10;break;
case 0xbb: a=11;break;
case 0x7b: a=12;break;
case 0xe7: a=13;break;
case 0xd7: a=14;break;
case 0xb7: a=15;break;
case 0x77: a=16;break;
}
return a;
}
void main()
{
a=16;
lcdint();
while(1)
{
keyscan();
if(a!=16)
{
write_cmd(0x80);
write_dat(0x30+a);
}
}

}
怎么该程序让它在9之后能显示10以上的楼层数字,不在显示ASCII码上的符号

第1个回答  2014-03-27
首先,LCD1602是一位一位(也就是ASCII值)显示的,你的那个a是0~16,你加了0x30,你可以查看ascii表,当a=10时加0x30就等于 3A 对应的ascii表为 :所以不会看到打印的是 :

那我们怎么打印出两位数呢?我们就要把a大于9的那部分提取出来。
if(a!=16)
{

if(a>9)
{
write_cmd(0x80);
write_dat(0x30+(a%10));//a%10 取个位
write_cmd(0x14);
write_dat(0x30+(a/10));
}
else
{
write_cmd(0x80);
write_dat(0x30+a);
}

}本回答被提问者采纳
第2个回答  2014-03-24
米发工程部

4*4矩阵键盘输入1602显示1-16,怎么9之后显示“:<;”之类的符号,没有显...
首先,LCD1602是一位一位(也就是ASCII值)显示的,你的那个a是0~16,你加了0x30,你可以查看ascii表,当a=10时加0x30就等于 3A 对应的ascii表为 :所以不会看到打印的是 :那我们怎么打印出两位数呢?我们就要把a大于9的那部分提取出来。if(a!=16){ if(a>9){ write_cmd(0x80);w...

通过4*4矩阵键盘输入1234567890显示到1602
你好!是采用这样的自画的键盘吗

...用单片机和4*4矩阵键盘输入数字并在LCD1602上显示出来的C语言程序...
sbit E=P2^7;\/\/1602使能引脚 sbit RW=P2^6;\/\/1602读写引脚 sbit RS=P2^5;\/\/1602数据\/命令选择引脚 \/ 名称 : Delay_1ms()功能 : 延时子程序,延时时间为 1ms * x 输入 : x (延时一毫秒的个数)输出 : 无 \/ void Delay_1ms(uint i)\/\/1ms延时 { uchar x,j;for(j=0;j<i;j++...

关于C51矩阵键盘按键显示到1602LCD的问题!求高手!
键盤跟LCD控制脚共用的结果

51单片机,1602液晶和矩阵键盘的P口冲突
1602是静态显示器件,不需要反复刷新,.所以大部分时间其接口是不被占用的,并且lcden WR RD和rs对LCD来说都是输入的,说明LCD不会主动乾扰你的其它工作 按键扫描倒是有可能乾扰LCD工作,但按键扫描也是在你控制下进行的,有时虽会改变LCD这几种功能引脚的状态,但不见得你的操作时序就符合LCD的...

...第二排由16个按钮控制,1到9,a到f。按下一个显示一个
看你的描述,你应该是想让人帮你写代码,根据现在的时间推算,应该是用于期末考试的。其实这个问题不复杂,一个是矩阵按键扫描,另一个是1602液晶屏的驱动。矩阵键盘你们课程上应该有相关例程,1602同理。自己动手丰衣足食。

51单片机矩阵键盘可以输入0~9,和26个英文字母,1602显示程序?
你的要有36个键了,最好用个键盘接口芯片,有了硬件才好写程序!

如何在液晶上显示汉字,单片机用的ATmega16,液晶是1602,求详细代码
14、4*4矩阵键盘(熟悉矩阵键盘编码、解码扫描原理 可作为人机输入接口 编写按键输入程序) 15、4个独立键盘(可做普通独立按键检测试验 本实验板4个独立按键采用跳线设计 考虑周全 可以通过跳线连接任意P口 方便学习者做 外中断INT0 INT1 外定时器T0 T1 实验)。 16、单片机32个IO口全部引出 端口扩展设计采用双排...

单片机开发板怎么用?
4. 矩阵键盘模块:16个小按键组成可以做外中断INT0、INT1 ,外定时器T0、T1 实验。 5. 数码管模块:由6个一位一体数码管组成,可以显示0,1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f等简单信息,构成信息交流的人机界面。 6. 蜂鸣器模块:可以用来做报警实验,也可以对歌曲进行编码,用来唱歌。 7. AD模块...

矩阵键盘怎样接线
sbit pu=P1^1;sbit spdd=P1^2;sbit spdu=P1^3;unsigned char code lcd_Assic[10]=;unsigned char dis[2][16]=,};\/\/0x20默认输出是空,即空格 void lcd_deal(unsigned char i,unsigned char j,unsigned char dat){ dis[i][j]=lcd_Assic[dat];} bit lcd_busy() \/\/判断是否忙碌...

相似回答