📄 main.c
字号:
if( 0x01 & Btemp ) //先发送低位, 再发高位
HC595_DS_H;
else
HC595_DS_L;
HC595_SHCP_L;
//asm("nop");
HC595_SHCP_H;
//asm("nop");
Btemp = Btemp >> 1;
}
//锁存
HC595_STCP_L;
//delay_nus( 1 );
HC595_STCP_H;
}
//数码管显示
void NumDisplay( unsigned char Bit, unsigned char num )
{
HC139_Sendbyte( Bit );
HC595_Send( Atab[num] ); //第3位数字显示数num
}
//注意此函数在循环体中使用
//内部包含5ms延时
void DataDisp( long int datal )
{
uchar i;
unsigned int wei[4];
wei[0] = datal / 1000;
wei[1] = (datal - wei[0] * 1000) / 100;
wei[2] = (datal - wei[0] * 1000 - wei[1] * 100) / 10;
wei[3] = datal % 10;
//显示停留时间
for( i = 0; i < 5; i++ )
{
NumDisplay( 0,wei[0] );
delay_nms( 3 );
NumDisplay( 1, wei[1] );
delay_nms( 3 );
NumDisplay( 2, wei[2] );
delay_nms( 3 );
NumDisplay( 3, wei[3] );
delay_nms( 3 );
}
}
//-----------------------------------------------------芯片74HC595以及74HC139部分接口函数(数码管)结束--------------------------------------------------
//-----------------------------------------------------ADC0832驱动部分函数--------------------------------------------------
/*
********************************************************************
** 函数名 :ADC0832读数据程序
** 入口 :需转换通道channel [0:1]
** 返回 : 无符号字符型 uchar
** 例子 : Data_adc = ReadAdc0832( 0 ); //读取adc0832芯片的0通道模拟电压
** 说明 : 使用时请在芯片加上精准电压源, 建议彩专用芯片
********************************************************************
*/
//工作时序
//当cs由高变低时,选中ADC0832。在时钟的上升沿,DI端的数据移入ADC0832内部的多路地址移位寄存器。
//在第一个时钟期间,Dl为高,表示启动位,紧接着输入两位配置位。当输入启动位和配置位后,选通输入模拟通道,转换开始。
//转换开始后,经过一个时钟周期延迟,以使选定的通道稳定。ADC0832接着在第4个时钟下降沿输出转换数据。
//数据输出时先输出最高位(D7~DO);输出完转换结果后,又以最低位开始重新输出一遍数据(D7~DO),两次发送的最低位共用。当片选cS
//为高时,内部所有寄存器清0,输出变为高阻态。如果要再进行一次模傲转换,片选cs必须再次从高向低跳变,后面再输入启动位和配置位
//adc0832读数据
uchar ReadAdc0832( uchar channel ) reentrant
{
uchar i = 0;
uchar outdata = 0;
//初始化: 选通 数据口保持高电平
//当cs由高变低时,选中ADC0832。在时钟的上升沿,DI端的数据移入ADC0832内部的多路地址移位寄存器
ADC0832_CS_L; // 使能
ADC0832_DIDO_H; //
ADC0832_SCK_L; //第一次触发
_nop_();
_nop_();
ADC0832_SCK_H; //
_nop_();
_nop_();
//模拟通道的选择及单端输入和差分输入的选择
ADC0832_DIDO_H;
ADC0832_SCK_L; //第二次触发
_nop_();
_nop_();
ADC0832_SCK_H;
_nop_();
_nop_();
if( channel == 1 )
{
ADC0832_DIDO_H;
}
else
{
ADC0832_DIDO_L;
}
ADC0832_SCK_L; //第三次触发
_nop_();
_nop_();
ADC0832_SCK_H;
_nop_();
_nop_();
ADC0832_SCK_L;
_nop_();
_nop_();
ADC0832_DIDO_H; //置为输入准备读数据
ADC0832_SCK_H;
_nop_();
_nop_();
outdata = 0; //初始化
//读数据D7~D0
for( i = 1; i <= 8; i++ )
{
if( ADC0832_DIDO == 1 )
{
outdata |= 0x01;
}
ADC0832_SCK_H;
ADC0832_SCK_L;
outdata = outdata << 1; //左移一位
}
//此函数不再读数据D0~D7 (注意D0位重叠)
ADC0832_CS_H; //禁止
return outdata;
}
//-----------------------------------------------------ADC0832驱动部分函数结束--------------------------------------------------
//显示标签
void sendlogo( void )
{
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " Test Message " );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "***************************************************************************" );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " 1 ---> test 4*4 " );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " 2 ---> test ADC0832 " );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " 3 ---> test shumaguang " );
UART_SendCh(10); //
UART_SendCh(13); //
UART_SendStr( " 4 ---> test I2C(24C64) " );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " 5 ---> no test " );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( " 06AotoControl QiXi.Qin dongxixiaonanbei@163.com" );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "***************************************************************************" );
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "Please enter you want to test --------> " );
}
//总初始化
void Device_init( void )
{
LCD_init();
Int0init();
UART_Init();
EA = 1;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main( void )
{
uchar tmp;
uint shu = 9999; //数码管初值
uchar new = 0;
uchar old = 0;
Device_init(); //总初始化
while( 1 )
{
EA = 0; //禁止中断,以免写液晶时出现不必要显示的字符
//4*4
if( flagwhole == 1 )
{
if( flagsendmessage44 == 1 )
{
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "<Press 4*4 , and then look at the LCD1602> " );
UART_SendCh(10); //
UART_SendCh(13);
flagsendmessage44 = 0;
}
new = KeyScan44();
if( old != new )
{
old = new;
LCD_write_datalongint( 2, 14, new );
if( new < 10 )
LCD_write_char( 2, 15, ' ' );
}
}
//AD采样
if( flagwhole == 2 )
{
if( flagsendmessageadc0832 == 1 )
{
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "<move R_pot , and then look at the LCD1602> " );
UART_SendCh(10); //
UART_SendCh(13);
flagsendmessageadc0832 = 0;
}
tmp = ReadAdc0832( 0 );
//清除一些不必要的显示
if( tmp < 100 )
LCD_write_char( 2, 15, ' ' );
if( tmp < 10 )
LCD_write_char( 2, 14, ' ' );
//显示该值
LCD_write_datalongint( 2, 13, tmp );
}
//数码管
if( flagwhole == 3 )
{
if( flagsendmessageshumaguang == 1 )
{
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "<look at the shumaguang> " );
UART_SendCh(10); //
UART_SendCh(13);
flagsendmessageshumaguang = 0;
}
DataDisp( shu-- );
}
//I2C(24C64)
if( flagwhole == 4 )
{
if( flagsendmessage24c64 == 1 )
{
UART_SendCh(10); //
UART_SendCh(13); //
UART_SendStr( "<please enter " );
UART_SendCh( Rec_Max / 10 + 0x30 );
UART_SendCh( Rec_Max % 10 + 0x30 );
UART_SendStr( " words to the Device 24C64> " );
UART_SendCh(10); //
UART_SendCh(13); //
flagsendmessage24c64 = 0; //标志清0
flagfillallow = 1; //允许开始装入数据
flagdoing24c64 = 1;
Rec_n = 0;
}
if( RecFullFlag == 1 ) //如果装满
{
UART_SendCh(10); //
UART_SendCh(13); //
UART_SendStr( ">>>>>You had finished sendding " );
UART_SendCh( Rec_n / 10 + 0x30 );
UART_SendCh( Rec_n % 10 + 0x30 );
UART_SendStr( " words to Device 24C64! " );
UART_SendCh(10); //
UART_SendCh(13); //
UART_SendStr( ">>>>>you can press 3 Keys on the board to see what you had send to the 24C64, " );
UART_SendCh(10); //
UART_SendCh(13); //
UART_SendStr( ">>>>>if you press the key *sure*, you can break out the job now, and it is the only way to break out ^_^ ");
UART_SendCh(10); //
UART_SendCh(13);
RecFullFlag = 0;
Rec_n = 0; //准备重新接收
}
if( sure == 1 )
{
sure = 0;
I2c_Write_n( 0xa0, add_p, Rec_buf, Rec_Max);
LCD_write_array( 2, 2, Rec_buf ); //在1602上显示该数组字符串
UART_SendCh(10); //
UART_SendCh(13);
UART_SendStr( "<you can test continue....> " );
UART_SendCh(10); //
UART_SendCh(13);
flagdoing24c64 = 0;
}
}
//正常状态
if( flagwhole == 5 )
{
flagwhole = 0; //置标志为0,不做任何测试
flagdoing24c64 = 0; //任务24C64的工作正在执行标志
LCD_write_string( 1, 0, " made by hebei " );
LCD_write_string( 2, 0, " NO TEST " );
sendlogo(); //显示标签
}
EA = 1; //打开全局中断
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -