📄 com.c
字号:
#include <iom88v.h>
#include <stdio.h>
#include <macros.h>
#include<eeprom.h>
#include<string.h>
#define changeHexToInt(hex) ( ( ((hex)>>4) *10 ) + ((hex)%16) )
#define amount 10
int n=0;
unsigned char inbox[amount];//接收缓冲 10
unsigned char x[]="hello";
void IntToStr(unsigned int Number, char *CalBuff,char add)
{
unsigned char i;
for (i = 0; i < 5; i++)
{
CalBuff[5-1-i] = (Number%10)+add;
Number /= 10;
}
}
//#include <usart.h>
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x67; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
void main(void)
{
char c;
char temp2;
char y[10];
unsigned char adcL,adcH;
char x[4],adc[3];
unsigned int dd;
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
ADMUX=96; //设置参考电压为AVCC,结构左对齐(就是8位精度)
ADCSRA|=135; //使能ADC,ADC时钟=系统时钟128分频
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x00; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources
PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x00; //power controller
SEI(); //re-enable interrupts
//all peripherals are now initialized
while(1)
{
switch(inbox[1])
{
case 0xFF:
put_char(inbox[1]);
inbox[1]='';
break;
case 'C':
EEPROMwrite(0x10,'a'); //向EEProm地址 0x10写相应的字符
EEPROM_WRITE(0x20,"hello123"); //字符串双引号
putstring(x);
DDRB=0x01; //定义 PB0为输出
PORTB=0x00; // PB0 输出低电平
inbox[1]='';
break;
case 'I':
temp2=EEPROMread(0x10);//读取EEProm地址 0x10对应的字符
put_char(temp2);
DDRB=0x01; //定义 PB0为输出
PORTB=0x01; // PB0 输出高电平
inbox[1]='';
break;
case 'F':
//EEPROM_READ(0x20,y); //读取EEProm地址 0x20对应的字符串
//putstring(y);
//DDRB=0x01;
//put_char(PB1);
if(PINB&BIT(1)) //PB1脚的电平为高时
{
if(PINB&BIT(1))
{
putstring("HELLO");
}
}
if(!(PINB&BIT(1)))//PB1脚的电平为低时
{
if(!(PINB&BIT(1)))
{
putstring("XXX");
}
}
inbox[1]='';
break;
case 'Q':
ADMUX=0x05; //清除已选择的ADC通道,选择新的ADC通道(0-7)
ADCSRA|=(1<<ADSC);//启动ADC转换
//ADCSRA|=64; //启动单次ADC转换
while((ADCSRA&16)==0); //等待ADC转换结束
adcL=ADCL; //结果左对齐只需读取高8位数据
adcH=ADCH; //read 2 high bits and shift into top byt
/*adc[0]='0x';
adc[1]=adcH;
adc[2]=adcL;*/
//adc=adc*380/1024;
//dd=changeHexToInt(adc);
//put_char(adc);
//IntToStr(dd,x,'0');
//putstring(adc);
//sprintf(dd, "%u", 123456);
dd=(int)ADC; //强制转换为十进制
IntToStr(dd,x,'0');//十进制转为字符输出
putstring(x);
//dd=changeHexToInt(ADC);
//IntToStr(dd,x,'0');
//putstring(x);
/*
put_char(ADCL);
put_char(ADCH);
/*
put_char(adc/100+48); //从串口输出ADC的百位数
put_char(adc/10%10+48); //从串口输出ADC的十位数
put_char(adc%10+48); //从串口输出ADC的个位数
delay_ms(500); //延时
ADCSRA|=16; //清除ADC转换结束标记
//putchar(13); //回车
//putchar(10); //换行*/
//put_char(ADCL);
//put_char(ADCH);
inbox[1]='';
break;
default:
break;
}
}
}
void delay_us(int time)//微秒级延迟程序
{
do
time--;
while(time>1);
}
void delay_ms(unsigned int time)//毫秒级延迟程序
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
void put_char(unsigned char c)
{
while (!(UCSR0A & (1<<UDRE0)));
UDR0=c;
}
void putstring(char *s)
{
while(*s)
{
put_char(*s);
s++;
}
put_char(0x0d);
put_char(0x0a);
}
unsigned char get_char(void)//字符输入函数
{
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
char temp;
temp=UDR0;
if((n<=amount))
{
inbox[n]=temp;
n++;
}
if((temp==0x0d)||(temp==0x0a)||(n>amount))
{
n=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -