高精密家用电子秤C程序.docx
- 文档编号:12372717
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:12
- 大小:16.02KB
高精密家用电子秤C程序.docx
《高精密家用电子秤C程序.docx》由会员分享,可在线阅读,更多相关《高精密家用电子秤C程序.docx(12页珍藏版)》请在冰豆网上搜索。
高精密家用电子秤C程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDATA_PORTP2
//-------------------------------------------
//12864管脚定义
//-------------------------------------------
sbitCD=P0^3;//数据(L)/命令(H)选择
sbitWRIT=P0^4;//写,低电平有效
sbitCE=P0^5;//使能,低电平有效
//-------------------------------------------
//TLC2543管脚定义
//-------------------------------------------
sbitCS=P1^2;
sbitCLK=P1^3;
sbitADin=P1^1;
sbitADout=P1^0;
sbitEOC=P1^4;
//-------------------------------------------
longtotal=0;//总价
longdat;//TLC2543端口数据
uinti=0;//Price中设置的变量
uintb[10];//用于存放Price
uints=0,y=0;//s用于保存小数点,y判断ENTER键
//===========================================
//函数声明
//-------------------------------------------
voiddelay(char);
voidwrite_data(char);
voidwrite_text(char);
voidwrite_com(char);
voidlcd_init_text();
voidtext_out(chara);
intasc2lcd(intasc);
voidcursor_on();
voidprint_text();
voidtext_location();
voidprint_string();
voidKey_Scan(void);
//--------------------------------------------
//写数据函数
//--------------------------------------------
voidwrite_data(chardat){
CD=0;//数据
CE=0;//LCD使能
WRIT=0;//写
DATA_PORT=dat;//把数据送到P口
delay
(1);//当晶振较高时加延时
WRIT=1;//关写
CE=1;//关使能
}
//--------------------------------------------
//写数据函数
//--------------------------------------------
voidwrite_text(chartext){
CD=0;//数据
CE=0;//LCD使能
WRIT=0;//写
DATA_PORT=text;//把数据送到P口
delay
(1);//当晶振较高时加延时
WRIT=1;//关写
CE=1;//关使能
}
//--------------------------------------------
//写命令函数
//--------------------------------------------
voidwrite_com(charcom){
CD=1;//命令
CE=0;
WRIT=0;
DATA_PORT=com;
delay
(1);//当晶振较高时加延时
WRIT=1;
CE=1;
}
//--------------------------------------------
//LM4229初始化函数
//--------------------------------------------
voidlcd_init_text(){
write_data(0);
write_data(0);
write_com(0x40);//settexthomeaddress
write_data(30);
write_data(0);
write_com(0x41);//settextarea;
write_com(0x84);//textattributemode
write_com(0x94);//textongraphicoff
}
voidcursor_on(){
write_com(0xA0);
write_com(0x93);
write_com(0x94);//textongraphicoff
}
voidprint_text(charx,chary,chara){
intplace;
place=x*30+y;
write_data(place&0xff);//写地址低8位
write_data(place/256);//写地址高8位
write_com(0x24);//设置地址
write_com(0xb0);//设置数据自动写
write_text(a);
write_com(0xb2);//自动复位
}
//-------------------------------------------
intasc2lcd(intasc){
uintr;
r=asc-32;
returnr;
}
voidtext_out(chara){
write_com(0xb0);//设置数据自动写
write_text(a);
write_com(0xb2);//自动复位
}
voidtext_location(intplace){
write_data(place&0xff);//写地址低8位
write_data(place/256);//写地址高8位
write_com(0x24);//设置地址
}
voidprint_string(char*str){
inti;
intch;
for(i=0;str[i]!
=0;i++)
{
ch=asc2lcd(str[i]);
text_out(ch);
}
}
//--------------------------------------------
//延时函数
//--------------------------------------------
voiddelay(uchart)
{
uintp,j;
for(p=0;p for(j=0;j<114;j++); } //------------------------------------------- //4*4矩键查寻键值函数 //------------------------------------------- voidKey_Scan(void) { ucharreadkey; uintx=200; ucharx_temp,y_temp; P3=0x0f; x_temp=P3&0x0f; if(x_temp==0x0f)gotokeyout; P3=0xf0; y_temp=P3&0xf0; readkey=x_temp|y_temp; readkey=~readkey; switch(readkey){ case0x11: break; case0x21: break; case0x41: break; case0x81: i=0;s=0;total=0;y=1;i=1;b[0]=0;delay(x);break;//CANCEL键; case0x12: b[i]=3;i++;delay(x);break; case0x22: b[i]=6;i++;delay(x);break; case0x42: b[i]=9;i++;delay(x);break; case0x82: y=1;if(s==0)s=i;break;//确认键 case0x14: b[i]=2;i++;delay(x);break; case0x24: b[i]=5;i++;delay(x);break; case0x44: b[i]=8;i++;delay(x);break; case0x84: b[i]=14;s=i;i++;delay(x);break;//小数点 case0x18: b[i]=1;i++;delay(x);break; case0x28: b[i]=4;i++;delay(x);break; case0x48: b[i]=7;i++;delay(x);break; case0x88: b[i]=0;i++;delay(x);break; default: break; } keyout: _nop_(); } //------------------------------------------- //读TLC2543端口数据函数 //------------------------------------------- uintreadAD(ucharport) { ucharch,i,j; uintad; ch=port; for(j=0;j<1;j++) { ad=0; ch=port; EOC=1; CS=1; CS=0; CLK=0; for(i=0;i<16;i++) { if(ADout)ad|=0x01; ADin=(bit)(ch&0x80);//取到ch的最高位 CLK=1; CLK=0; ch<<=1; ad<<=1; } } CS=1;/////////转换和读取数值 while(! EOC); ad>>=1; return(ad); } //------------------------------------------- //main函数 //------------------------------------------- main(){ uintA1,A2,A3,A4;//A1——A4为重量 uintB0,B1,B2,B3,B4;//B0——B4为总价 uintj; while (1){ Key_Scan(); dat=readAD(0x0c); A1=(dat*122)/100000;//12位端口最大数4096和5000g之间有1.22的倍数关系; A2=(dat*122)%100000/10000; A3=(dat*122)%10000/1000; A4=(dat*122)%1000/100; //------------------------------------------- //显示重量 //------------------------------------------- lcd_init_text(); text_location(0); print_string("weight: "); text_out(A1+16); text_out(14); text_out(A2+16); text_out(A3+16); text_out(A4+16); print_string("kg"); //------------------------------------------- //显示单价Price //------------------------------------------- text_location(60); print_string("Price: "); for(j=0;j if(b[j]==14) text_out(b[j]); else text_out(b[j]+16); } if(i==1){ for(j=i;j<15;j++){ text_out(0xff); } } //------------------------------------------- //当ENTER键按下后,显示总价 //------------------------------------------- if(y==1){ if(s==0){ if(i>=2) total+=dat*122*b[1]/10; } if(s==1){ total+=dat*122*b[0]; if(i>=3) total+=dat*122*b[2]/10; } if(s==2){ total=total+dat*122*b[0]*10+dat*122*b[1]; if(i>=4) total+=dat*122*b[3]/10; } B0=(total)/10000000; B1=(total)%10000000/1000000; B2=(total)%1000000/100000; B3=(total)%100000/10000; B4=(total)%10000/1000; text_location(120); print_string("Total: "); text_out(B0+16); text_out(B1+16); text_out(B2+16); text_out(14); text_out(B3+16); text_out(B4+16); y=0; i=0; s=0; total=0; delay(100); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精密 家用 电子秤 程序