怎样在5110LCD屏上显示五位数(从0开始递增)51单片机C程序

怎样在5110LCD屏上显示五位数(从0开始递增)51单片机C程序,第1张

就可以了

int A=0xCCBB

int SAVE

char B,C

SAVE=A //将A暂存

A=A&0x00FF //屏蔽高8位

B=(char)A //B中的数据为0xBB(低8位)

A=SAVE //将暂存的数据返回

A=A&0xFF00 //屏蔽低8位(这句可以省掉,在下句右移时高位就全部移入0)

A=A>>8 //右移8位,将高8位移到低8位

C=(char)A //C中的数据为0xCC(高8位)

void LCD_write_bianliang(INT8U row,INT8U page,INT8U a,int c) //row:列 page:页 c:变量

{

int a1,a2,a3

a1=c/100

a2=c%100/10

a3=c%10

if(a==1)

{

LCD_write_shu(row,page,a3)

}

else if(a==2)

{

LCD_write_shu(row,page,a2)

LCD_write_shu(row+1,page,a3)

}

else

{

LCD_write_shu(row,page,a1)

LCD_write_shu(row+1,page,a2)

LCD_write_shu(row+2,page,a3)

}

}

/*-------------------------------------------------------------

LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类

输入参数: c:显示的字符;

---------------------------------------------------------------*/

void LCD_write_shu(INT8U row,INT8U page,INT8U c) //row:列 page:页 c:字符

{

INT8U i

LCD_set_XY(row*8,page)// 列,页 row*8

for(i=0i<8i++)

{

LCD_write_word(shuzi[c][i],1)

}

LCD_set_XY(row*8,page+1)// 列,页row*8

for(i=8i<16i++)

{

LCD_write_word(shuzi[c][i],1)

}

}

/*---------------------------------------------

LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类

输入参数:c:显示的字符;

-----------------------------------------------*/

void LCD_write_hanzi(INT8U row, INT8U page,INT8U c) //row:列 page:页 c:字符

{

INT8U i

LCD_set_XY(row*8, page)// 列,页row*8

for(i=0i<16i++)

{

LCD_write_word(hanzi[c][i],1)

}

LCD_set_XY(row*8, page+1)// 列,页 row*8

for(i=16i<32i++)

{

LCD_write_word(hanzi[c][i],1)

}

}

其中有一段是显示变量的,那个时候简单写的,你试试看

#include "apprfid.h"

#include "CMDHEAD.h"

#if USE_UART

#include "../uart/uart.h"

#else

#include "../softuart/softuart.h"

#endif

//发送命令

//命令格式为 [AA] [BB] + [长度字] +[命令字] + [数据域] + [校验码]

//这个文件打包了所有底层指令

//包含,读卡,写卡

//初始化钱包,钱包的增值,扣款等

//修改密钥的做法和写卡是同一回事,因此没有额外指出

//注意密钥是存放在每个扇区的第三个块,也就是BLOCK3中

//因此改密钥实际上就是用老密钥读取要修改密钥的第三个块

//然后把新密钥替换读取的数据,然后用老密钥写回

//写成功之后,再读写该扇区其它块,就需要使用新的密钥

//本文件最后做了示例

//本文只描述了将命令打包发送给模块

//并没有分析模块返回来的数据

//模块返回数据建议用户自行构建一个串口中断函数

//中断函数完成对数据帧的接受

//首先判断 AA BB 标志,接收到后清零缓冲区

//第一个字节是数据包的长度,依据这个来读取相应的长度

//第一个长度字之后连续读取长度字对应的长度数据,

//最后一个字节是校验码,校验函数在下面有

//如果校验通过,设置一个命令成功接受的标志,让主程序进行处理

//否则重新接受串口数据

u8 __idata cmdbuf[32]//需要发送的命令缓冲区

//crc校验

u8 CheckSum(u8 *databuf)

{

u8 tmp = databuf[0]-1

u8 chksum=databuf[0]

while(tmp)

{

chksum^=databuf[tmp]

tmp--

}

if(databuf[databuf[0]]==chksum) return 1

else

databuf[databuf[0]]=chksum

return 0

}

//发送结果给上位机

void cmd_proend(void)

{

u8 tmp

CheckSum(cmdbuf)//先做校验

sputc(0xAA)

sputc(0xBB)

//下面把结构中所有的数据都发送出去

for(tmp=0tmp<cmdbuf[0]+1tmp++)

{

sputc(cmdbuf[tmp])

if(cmdbuf[tmp]==0xAA)//如果数据域中有0XAA,再发个零跟着

{

sputc(0)

}

}

}

//获得模块ID

void getmoduleID(void)

{

cmdbuf[0] = 2//长度字

cmdbuf[1] = PCD_PN//命令类型,读头序列号

cmd_proend()

}

//寻卡

void SelCard(void)

{

cmdbuf[0] = 02//长度字

cmdbuf[1] = CARD_TYPE//命令类型,读卡类型

cmd_proend()

}

//读卡号

void ReadUID(void)

{

cmdbuf[0] = 02//长度字

cmdbuf[1] = CARD_SN//命令类型,读卡号

cmd_proend()

}

//读块

void ReadBlock(u8 blockn,u8 *key)

{

u8 tmp

cmdbuf[0] = 0x0a//长度字

cmdbuf[1] = READ_BLOCK//命令类型,读块

cmdbuf[2] = 0x00//密钥标志,TYPEA

cmdbuf[3] = blockn//块号

for(tmp=0tmp<6tmp++)

cmdbuf[4+tmp] = key[0+tmp]//6字节密钥

cmd_proend()

}

//写块

void WriteBlock(u8 blockn,u8 *buf,u8 *key)

{

u8 tmp

cmdbuf[0] = 0x1a//长度字

cmdbuf[1] = WRITE_BLOCK//命令类型,写块

cmdbuf[2] = 0x00//密钥标志,TYPEA

cmdbuf[3] = blockn//块号

for(tmp=0tmp<6tmp++)

cmdbuf[4+tmp] = key[0+tmp]//6字节密钥

for(tmp=0tmp<16tmp++)

cmdbuf[10+tmp] = buf[0+tmp]//16字节数据

cmd_proend()

}

//初始化钱包

void Init_PURSE(u8 blockn,u8 *buf,u8 *key)

{

u8 tmp

cmdbuf[0] = 0x0e//长度字

cmdbuf[1] = INIT_PURSE//命令类型,初始化钱包

cmdbuf[2] = 0x00//密钥标志,TYPEA

cmdbuf[3] = blockn//块号

for(tmp=0tmp<6tmp++)

cmdbuf[4+tmp] = key[0+tmp]//6字节密钥

for(tmp=0tmp<4tmp++)

cmdbuf[10+tmp] = buf[0+tmp]//16字节数据

cmd_proend()

}

//钱包充值

void Add_PURSE(u8 blockn,u8 *buf,u8 *key)

{

u8 tmp

cmdbuf[0] = 0x0e//长度字

cmdbuf[1] = ADD_PURSE//命令类型,初始化钱包

cmdbuf[2] = 0x00//密钥标志,TYPEA

cmdbuf[3] = blockn//块号

for(tmp=0tmp<6tmp++)

cmdbuf[4+tmp] = key[0+tmp]//6字节密钥

for(tmp=0tmp<4tmp++)

cmdbuf[10+tmp] = buf[0+tmp]//16字节数据

cmd_proend()

}

//钱包扣款

void Dec_PURSE(u8 blockn,u8 *buf,u8 *key)

{

u8 tmp

cmdbuf[0] = 0x0e//长度字

cmdbuf[1] = DEC_PURSE//命令类型,初始化钱包

cmdbuf[2] = 0x00//密钥标志,TYPEA

cmdbuf[3] = blockn//块号

for(tmp=0tmp<6tmp++)

cmdbuf[4+tmp] = key[0+tmp]//6字节密钥

for(tmp=0tmp<4tmp++)

cmdbuf[10+tmp] = buf[0+tmp]//16字节数据

cmd_proend()

}

/*

//需要改哪个区块的密码

//clus 扇区号0-15,一共16个扇区,0号原则上不动

u8 CHG_PWD(u8 clus,u8 *oldkey,u8 *newkey, u8 keystyle)

{

u8 cardsn[6]//前两位ID,后四位sn

u8 blockdata[64]={0xff}//16个返回的数据

u8 tmp//

if(clus >15) return 1//扇区号不对

if(Read_Block((clus+1)*4-1,oldkey,blockdata,keystyle)) return 3//首先读到密码

for(tmp=0tmp<6tmp++)

{

blockdata[tmp]=newkey[tmp]//密码替换

}

if(Write_Block((clus+1)*4-1,oldkey,blockdata,keystyle)) return 4//密码更新

return 0

}

*/


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11107361.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存