📄 text2.c
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
//
// H.C.H
// NNU(南京师范大学通信工程)
// TLC0838驱动程序TLC0838_II.c
// uchar adc_tlc0838(uchar channel);
// 函数说明:channel为通道的选择:0……CH0 1……CH1 2……CH2 3……CH3
// 当error=0时,返回的值为有效值,当error=1时,返回值无效
///////////////////////////////////////////////////////////////////////////////////////////////
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^6; //TLC0838---PIN16
sbit DI=P1^5; //TLC0838---PIN17
sbit DO=P1^7; //TLC0838---PIN14
sbit CS=P1^4; //TLC0838---PIN18
//SE接成低电平
//1602 数据口定义
#define lcd_bus P0
//1602引脚定义
sbit rs=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
//ASCII码表
/**********0---9**************/
unsigned int code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**********a---z**************/
unsigned int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
/***********A---Z*************/
unsigned int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};
//基本变量定义
//uchar cnt;
unsigned int d[3];
bit error=1;
uint adc_tlc0838(uchar channel)
{
uchar t,i;
uint Temp1=0,Temp2=0;
if (channel==0) t=0;
else if(channel==1) t=1;
else if(channel==2) t=4;
else if(channel==3) t=5;
else if(channel==4) t=2;
else if(channel==5) t=3;
else if(channel==6) t=6;
else if(channel==7) t=7;
CS=1;
_nop_();_nop_();_nop_();_nop_();
CLK=0;
CS=0; //使AD通道打开
DI = 1; //Start bit=1
CLK = 1;
_nop_();
_nop_();
CLK=0;
CS=0;
DI = 1;
CLK = 1;
_nop_();
_nop_();
for(i=0;i<3;i++)
{
CLK = 0;
_nop_();
_nop_();
if(t&1)DI=1;
else DI=0;
t=t>>1;
CLK = 1;
_nop_();
_nop_();
}
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
for(i=0;i<=6;i++)
{
CLK = 0; //时钟为低电平
if(DO)
{ //如果采集到的位为1
Temp1=Temp1+1; //给临时存储Temp1加1
Temp1=Temp1<<1;
} //临时存储器左移一位
else
Temp1=Temp1<<1; //如果采集到的数位为0,临时存储器左移一位
_nop_();
_nop_();
_nop_();
_nop_();
CLK = 1;
} //时钟为高电平,完成一个时钟周期数据采集
CLK = 0;
if(DO) Temp1=Temp1+1;
if(DO) Temp2=0x80;
CLK = 1;
//采集数据校验
for(i=0;i<=6;i++)
{
CLK=0;
if(DO){
Temp2=Temp2>>1;
Temp2=Temp2+0x80; }
else
Temp2=Temp2>>1;
CLK = 1;
}
CS = 1;
if(Temp1==Temp2) //判断数据采集是否有效
{
error=0;
return Temp1;
}
else
{
error=1;
return 0;
}
}
/*
hexstoascii2(unsigned int hex)
{
d[0]=table[hex/10];
hex=hex%10;
d[1]=table[hex];
}
*/
hexstoascii3(unsigned int hex)
{
d[0]=table[hex/100];
hex=hex%100;
d[1]=table[hex/10];
hex=hex%10;
d[2]=table[hex];
}
/*********延时子程序**********/
void delay(uchar dy)
{
while(--dy);
}
/***********忙判断标志,返回一个位BF********************/
bit lcd_busy(void)
{
uchar busy_flag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
busy_flag=lcd_bus; //e在高电平时读
e=0;
return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0
***************/
void lcd_wrcmd(unsigned char lcdcmd)
{
while(lcd_busy()); //等待空闲
lcd_bus=lcdcmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0; //产生一个下沿
}
/***************向液晶写数据******************/
void lcd_wrdata(uchar lcddata)
{
while(lcd_busy()); //等待空闲
lcd_bus=lcddata; //在下沿的时候写数据
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
void lcd_clear(void)
{
lcd_wrcmd(0x01); //液晶清屏控制字 并延时>40us
delay(100);
}
/***********1602液晶的初始化***************/
void lcd_init(void)
{
lcd_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay(100);
lcd_wrcmd(0x0c); //显示开关控制----显示开关开,光标开关关,闪烁开关关
delay(100);
lcd_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
delay(100);
lcd_wrcmd(0x01); //清屏
delay(100);
}
/**********4*4矩阵键盘****************/
/************
矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
D C B A
1〔15 14 13 12〕
2〔11 10 9 8〕
3〔 7 6 5 4〕
4〔 3 2 1 0〕
利用已有的那个按键程序
*************/
/*
uchar getkey_ii()
{
unsigned char keycode=0xff,temp,i;
P1=0x0f;
temp=P1&0x0f;
if(temp!=0x0f) //有键按下
{
// beep=0;
P1=0x7f;
for(i=0;i<4;i++)
{
temp=P1&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
P1=(P1>>1)|0x80;
}
while((P1&0x0f)!=0x0f) {P1=0x0f; } //等待释放
// beep=1;
}
return keycode;
}
*/
/************单个读键****************/
//没有按键时返回键值0;
//
//P2.3 P2.2 P2.1 P2.0
// 1 2 3 4
/*
unsigned char getkey()
{
unsigned char k,tem,keytem;
keytem=0;
tem=P2&0x0f;
if(tem!=0x0f)
{
for(k=0;k<10;k++) delay(250); //加延时防抖
tem=P2&0x0f;
if(tem!=0x0f)
{ if(tem==0x07) keytem=1; // 按下去的键对应的位是0;
else if(tem==0x0b) keytem=2;
else if(tem==0x0d) keytem=3;
else if(tem==0x0e) keytem=4;
}
}
while(tem!=0x0f) tem=P2 & 0x0f; //等待按键释放
return(keytem);
}
*/
/************无线键盘4*4****************/
//无线键盘的四个译码输出口从低到高依次对应于P1口的低四位
//下面是无线键盘的键值分布
// 8 4 2 1 码输出;
// 返回的直接就是键值 (很好用)
/*
uchar getkey_juzhen()
{
unsigned char keytem=0,k,tem;
tem=P1&0x0f;
for(k=0;k<10;k++) delay(100); //加延时防抖
tem=P1&0x0f;
keytem=tem;
while((tem=P1&0x0f)!=0); //等待按键释放
return(keytem);
}
*/
/*
main()
{
uchar result;
result=adc_tlc0838(0);
while(1);
}
*/
void main()
{
unsigned int result,result1;
unsigned char i;
unsigned int t;
unsigned char str0[]="System of P.H.Y";
unsigned char str1[]=" 2005/7/28";
unsigned char str2[]=" 20:27";
unsigned char str3[]="v";
unsigned char str4[]=".";
unsigned char kk=0x80;
// unsigned char key;
unsigned int count1=10;
unsigned int count2=297;
delay(2);
lcd_bus=0xff;
lcd_init();
lcd_wrcmd(kk+0x00);
for(i=0;i<15;i++) lcd_wrdata(str0[i]);
for(t=0;t<1000;t++) delay(250);
lcd_clear();
while(1)
{
result=adc_tlc0838(0);
// key=getkey_ii();
// hexstoascii2(count1);
// hexstoascii3(count2);
result1=2*result;
hexstoascii3(result1);
// if(key==0)
// lcd_clear();
lcd_wrcmd(kk+0x00);
for(i=0;i<13;i++) lcd_wrdata(str1[i]);
lcd_wrcmd(kk+0x46); lcd_wrdata(d[0]);
lcd_wrcmd(kk+0x48);
for(i=1;i<3;i++) lcd_wrdata(d[i]);
lcd_wrcmd(kk+0x4a); lcd_wrdata(str3[0]);
lcd_wrcmd(kk+0x47); lcd_wrdata(str4[0]);
// }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -