åèä¸ä¸å§ï¼
#include<reg52.h> //å
å«å¤´æ件ï¼ä¸è¬æ
åµä¸éè¦æ¹å¨ï¼å¤´æ件å
å«ç¹æ®åè½å¯åå¨çå®ä¹
#define DataPort P0 //å®ä¹æ°æ®ç«¯å£ ç¨åºä¸éå°DataPort åç¨P0 æ¿æ¢
#define KeyPort P1
sbit LATCH1=P2^2;//å®ä¹éå使è½ç«¯å£ 段éå
sbit LATCH2=P2^3;// ä½éå
unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// æ¾ç¤ºæ®µç å¼0~F
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//åå«å¯¹åºç¸åºçæ°ç 管ç¹äº®,å³ä½ç
unsigned char TempData[8]; //åå¨æ¾ç¤ºå¼çå
¨å±åé
void DelayUs2x(unsigned char t);//us级延æ¶å½æ°å£°æ
void DelayMs(unsigned char t); //ms级延æ¶
void Display(unsigned char FirstBit,unsigned char Num);//æ°ç 管æ¾ç¤ºå½æ°
unsigned char KeyScan(void);//é®çæ«æ
unsigned char KeyPro(void);
void Init_Timer0(void);//å®æ¶å¨åå§å
/*------------------------------------------------
主å½æ°
------------------------------------------------*/
void main (void)
{
unsigned char num,i,j;
unsigned char temp[8];
Init_Timer0();
while (1) //主循ç¯
{
num=KeyPro();
if(num!=0xff)
{
if(i<8)
{
temp[i]=dofly_DuanMa[num];
for(j=0;j<=i;j++)
TempData[7-i+j]=temp[j];
}
i++;
if(i==9)//å¤åºä¸ä¸ªæé®è¾å
¥ä¸ºäºæ¸
å± åæ¬åºè¯¥ä¸º8
{
i=0;
for(j=0;j<8;j++)//æ¸
å±
TempData[j]=0;
}
}
//Display(0,8); //æ¾ç¤ºå
¨é¨8ä½
//主循ç¯ä¸æ·»å å
¶ä»éè¦ä¸ç´å·¥ä½çç¨åº
}
}
/*------------------------------------------------
uS延æ¶å½æ°ï¼å«æè¾å
¥åæ° unsigned char tï¼æ è¿åå¼
unsigned char æ¯å®ä¹æ 符å·å符åéï¼å
¶å¼çèå´æ¯
0~255 è¿é使ç¨æ¶æ¯12Mï¼ç²¾ç¡®å»¶æ¶è¯·ä½¿ç¨æ±ç¼,大è´å»¶æ¶
é¿åº¦å¦ä¸ T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延æ¶å½æ°ï¼å«æè¾å
¥åæ° unsigned char tï¼æ è¿åå¼
unsigned char æ¯å®ä¹æ 符å·å符åéï¼å
¶å¼çèå´æ¯
0~255 è¿é使ç¨æ¶æ¯12Mï¼ç²¾ç¡®å»¶æ¶è¯·ä½¿ç¨æ±ç¼
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大è´å»¶æ¶1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
æ¾ç¤ºå½æ°ï¼ç¨äºå¨ææ«ææ°ç 管
è¾å
¥åæ° FirstBit 表示éè¦æ¾ç¤ºç第ä¸ä½ï¼å¦èµå¼2表示ä»ç¬¬ä¸ä¸ªæ°ç 管å¼å§æ¾ç¤º
å¦è¾å
¥0表示ä»ç¬¬ä¸ä¸ªæ¾ç¤ºã
Num表示éè¦æ¾ç¤ºçä½æ°ï¼å¦éè¦æ¾ç¤º99两ä½æ°å¼å该å¼è¾å
¥2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //æ¸
空æ°æ®ï¼é²æ¢æ交æ¿éå½±
LATCH1=1; //段éå
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //åä½ç
LATCH2=1; //ä½éå
LATCH2=0;
DataPort=TempData[i]; //åæ¾ç¤ºæ°æ®ï¼æ®µç
LATCH1=1; //段éå
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
å®æ¶å¨åå§ååç¨åº
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使ç¨æ¨¡å¼1ï¼16ä½å®æ¶å¨ï¼ä½¿ç¨"|"符å·å¯ä»¥å¨ä½¿ç¨å¤ä¸ªå®æ¶å¨æ¶ä¸åå½±å
//TH0=0x00; //ç»å®åå¼
//TL0=0x00;
EA=1; //æ»ä¸ææå¼
ET0=1; //å®æ¶å¨ä¸ææå¼
TR0=1; //å®æ¶å¨å¼å
³æå¼
}
/*------------------------------------------------
å®æ¶å¨ä¸æåç¨åº
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=(65536-2000)/256; //éæ°èµå¼ 2ms
TL0=(65536-2000)%256;
Display(0,8); // è°ç¨æ°ç 管æ«æ
}
/*------------------------------------------------
æé®æ«æå½æ°ï¼è¿åæ«æé®å¼
------------------------------------------------*/
unsigned char KeyScan(void) //é®çæ«æå½æ°ï¼ä½¿ç¨è¡åé级æ«ææ³
{
unsigned char Val;
KeyPort=0xf0;//é«åä½ç½®é«ï¼ä½åä½æä½
if(KeyPort!=0xf0)//表示ææé®æä¸
{
DelayMs(10); //å»æ
if(KeyPort!=0xf0)
{ //表示ææé®æä¸
KeyPort=0xfe; //æ£æµç¬¬ä¸è¡
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
DelayMs(10); //å»æ
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //æ£æµç¬¬äºè¡
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
DelayMs(10); //å»æ
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //æ£æµç¬¬ä¸è¡
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
DelayMs(10); //å»æ
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //æ£æµç¬¬åè¡
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
DelayMs(10); //å»æ
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
/*------------------------------------------------
æé®å¼å¤çå½æ°ï¼è¿åæ«é®å¼
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0;break;//0 æä¸ç¸åºçé®æ¾ç¤ºç¸å¯¹åºçç å¼
case 0x7d:return 1;break;//1
case 0x7b:return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
case 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7:return 7;break;//7
case 0xde:return 8;break;//8
case 0xdd:return 9;break;//9
case 0xdb:return 10;break;//a
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
温馨提示:内容为网友见解,仅供参考
单片机告诉一个地址,怎样用C语言编程读取地址处的值???
define KeyPort P1 sbit LATCH1=P2^2;\/\/定义锁存使能端口 段锁存 sbit LATCH2=P2^3;\/\/ 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};\/\/ 显示段码值0~F unsigned char code dofly_WeiMa...
51单片机把数据存入指定的地址或在读指定地址的数据用C语言怎么写?
1. 绝对宏:在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知,例如:rval=CBYTE[0x0002];指向程序存贮器的0002h地址 rval=XWORD[0x0002];指向外RAM的0002h地址 2. _at_关键...
怎么通过串口读取51单片机某个地址的数据?请用C语言写出来。
首先,你要明确在C语言中读取内存地址是基于指针的。3.比如读取内存地址0x22中的数据 C语言中对于内存的访问是基于指针的,这个毋庸置疑,具体操如下 unsigned int *p= (unsigned int*)0x22 ;\/\/定义指针,并且使指针指向了0x22这个 内存地址;那么*p就是最终你要读取的数据了。4.至于如何通过串...
怎么用c语言编程51单片机读写程序?
编程代码如下:ORG 0000H MOV DPTR,#1000H ;给源数据块地址指针DPTR赋初值 MOV P2, #20H ;给目的数据块地址指针P2和R0赋初值 MOV RO,#00H LOOP: MOVX A, @DPTR .MOVX @RO, A .INC DPTR INC RO CJNE RO,#64H, LOOP SJMP
单片机C语言,怎么存储和调用一段数据
xvar = XBYTE[0x1000]然后对xvar赋值或取值即可 如果用汇编 要用 MOVX A,@DPTR 和\/或 MOVX @DPTR,A 指令分别进行读写 硬件上要用到芯片6264和74LS373 C51芯片的PSEN ALE RD WR都要按照兼容方式连接 单片机可扩展性极佳,提供了丰富的微指令减轻开发者负担,利用寻址的差异区分存储空间.事实上,上述...
单片机C语言中,如何读取P1口的数据,并将P1口读入的数据送到P0口输出...
你这个程序是对的。但是有一点忽略了:P1口作为输入口,应该先置为ff 完整程序:while(1){ P1=0xff;\/\/这个就是忽略的地方 i=P1;P0=i;} 另外,下面这个也可以,以经过软件仿真通过。P1=P0;
用C语言给51单片机编程时,怎样用P0口输出地址和数据?
只要C语句能保证编译出MOVX指令即可。你可以自行学习以下关键字的用法:pdata,xdata PBYTE,XBYTE 点到为止。剩下的自己去琢磨,Keil里面都能搜索到的。
单片机中怎样给地址赋值
比如 *unsigned a; a=0x21;*a=你要赋予的值 有些指针直接在keil、MDK就已经头文件里定义好了,直接访问即可 arm的这需要访问寄存器,麻烦,不介绍了
单片机,不嵌入汇编,C语言怎么读ROM某个地址存储的值
对于单片机 rom都是有一个起始地址的。比如是0xb0000000 然后 要读偏移量是0x1234上一个字节的值 只需要 ((char *)(0xb0000000+0x1234))其它的类似
keil怎么读出是ram某个地址的数
将要读取的地址转换为指针,然后通过指针读取该地址的数据。需要注意的是,根据实际情况可能需要调整指针类型和地址。keil指KeilC51,是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。