大概代码,但是总报错for等语句,哪里有问题
我想做一个,按下接p1.0的K1开关,模拟车辆进入,步进电机转动模拟抬杆,同时下面由74hc5 95控制的红灯亮起时,lm016l 切换到第二页,同时开始计时收费,每小时3块钱,前面计时,后面收费,两个车位一页,16个车位共八页,第10页记录所有收款金额数。总共10页(包含首页车辆进出情况)。当我按下接p1.1开关K2时,步进电机转动模拟抬杆,同时红灯熄灭,停止计时收费,5秒后自动清零清零,但是所收费用归入第十页的总收入里。接p1.3的K3是人工控制抬杆进,接p1.4d的K4是人工控制抬杠出。接p2.5的开关k5控制翻页。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
/************************** 硬件引脚定义 **************************/
// 按键
sbit K1 = P1^0; // 车辆进入
sbit K2 = P1^1; // 车辆离开
sbit K3 = P1^2; // 人工抬杆进
sbit K4 = P1^3; // 人工抬杆出
sbit K5 = P2^5; // 翻页控制
sbit beep = P1^7;// 蜂鸣器
// 74HC595控制
sbit SH = P3^5;
sbit ST = P3^6;
sbit DS = P3^7;
// 步进电机控制(ULN2003A)
#define MOTOR_PORT P2
uchar code MOTOR_CW[] = {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; // 正转序列
uchar code MOTOR_CCW[] = {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; // 反转序列
/************************** 全局变量定义 **************************/
uchar enter_count = 0; // 进入车辆数
uchar exit_count = 0; // 离开车辆数
uchar current_cars = 0; // 当前车辆数
uint current_page = 1; // 当前显示页(1-10)
uint total_income = 0; // 总收入(第10页显示)
uint timer[16] = {0}; // 每个车位计时(秒)
uchar display_cars[2]; // 当前页显示的2个车位状态
/************************** LCD1602驱动 **************************/
#ifndef LCD1602_H
#define LCD1602_H
sbit LCD_RS = P1^4;
sbit LCD_RW = P1^5;
sbit LCD_E = P1^6;
// 微延时
void lcd_delay(uint ms) {
uint i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
// 写命令
void lcd_write_cmd(uchar cmd) {
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;
P0 = cmd;
lcd_delay(3);
LCD_E = 1;
lcd_delay(25);
LCD_E = 0;
}
// 写数据
void lcd_write_data(uchar dat) {
LCD_E = 0;
LCD_RS = 1;
LCD_RW = 0;
P0 = dat;
lcd_delay(3);
LCD_E = 1;
lcd_delay(25);
LCD_E = 0;
}
// 初始化LCD
void lcd_init() {
lcd_write_cmd(0x38); // 8位接口,2行显示
lcd_write_cmd(0x0c); // 显示开,光标关
lcd_write_cmd(0x06); // 地址自增
lcd_write_cmd(0x01); // 清屏
}
// 显示字符串(指定位置)
void lcd_show_string(uchar line, uchar col, uchar *str) {
if(line == 1) lcd_write_cmd(0x80 + col);
else lcd_write_cmd(0x80 + 0x40 + col);
while(*str != '\0') {
lcd_write_data(*str);
str++;
}
}
// 显示2位数字(自动补位)
void lcd_show_num2(uchar line, uchar col, uint num) {
if(line == 1) lcd_write_cmd(0x80 + col);
else lcd_write_cmd(0x80 + 0x40 + col);
if(num >= 100) {
lcd_write_data(0x30 + num/100%10);
lcd_write_data(0x30 + num/10%10);
} else {
if(num < 10) lcd_write_data(' ');
lcd_write_data(0x30 + num/10%10);
}
lcd_write_data(0x30 + num%10);
}
#endif
/************************** 通用延时函数 **************************/
void delay_ms(uint ms) {
uint i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 120; j++);
}
/************************** 步进电机控制 **************************/
// 正转抬杆
void motor_raise() {
uint i, j;
for(i = 0; i < 5; i++) { // 转动5圈
for(j = 0; j < 8; j++) { // 8拍控制
MOTOR_PORT = MOTOR_CW[j];
delay_ms(20); // 控制速度
}
}
MOTOR_PORT = 0x00; // 停止
}
// 反转落杆
void motor_lower() {
uint i, j;
for(i = 0; i < 5; i++) { // 转动5圈
for(j = 0; j < 8; j++) { // 8拍控制
MOTOR_PORT = MOTOR_CCW[j];
delay_ms(20); // 控制速度
}
}
MOTOR_PORT = 0x00; // 停止
}
/************************** 74HC595控制 **************************/
void hc595_write(uint data) {
uchar i;
ST = 0;
for(i = 0; i < 16; i++) {
SH = 0;
DS = (data & 0x0001) ? 1 : 0;
SH = 1;
data >>= 1;
}
ST = 1;
}
uint get_led_state(uchar car_count) {
uchar i;
uint state = 0;
for(i = 0; i < car_count; i++) {
state |= 1 << i;
}
return state;
}
/************************** 计时收费逻辑 **************************/
void update_timer() {
uchar i;
for(i = 0; i < 16; i++) {
if( (get_led_state(current_cars) & (1 << i)) ) {
timer[ i]++; // 仅对占用车位计时
}
}
}
uint calculate_fee(uint seconds) {
return (seconds / 3600 + (seconds % 3600 ? 1 : 0)) * 3;
}
/************************** 页面显示逻辑 **************************/
void show_page1() {
lcd_init();
lcd_show_string(1, 0, "Enter: Exit:");
lcd_show_string(2, 0, "Cars: Empty:");
lcd_show_num2(1, 6, enter_count);
lcd_show_num2(1, 14, exit_count);
lcd_show_num2(2, 5, current_cars);
lcd_show_num2(2, 13, 16 - current_cars);
}
void show_car_page(uchar page_idx) {
uchar start = (page_idx - 2) * 2; // 计算起始车位
lcd_init();
lcd_show_string(1, 0, "Car ");
lcd_show_num2(1, 4, start + 1);
lcd_show_string(1, 6, "-");
lcd_show_num2(1, 7, start + 2);
lcd_show_string(1, 9, "Fee:");
// 获取车位状态
display_cars[0] = (get_led_state(current_cars) & (1 << start)) ? 1 : 0;
display_cars[1] = (get_led_state(current_cars) & (1 << (start + 1))) ? 1 : 0;
// 显示车位1状态
lcd_show_string(2, 0, "State:");
lcd_show_string(2, 6, display_cars[0] ? "Occupy" : "Empty");
// 显示费用1
if(display_cars[0]) {
lcd_show_num2(2, 12, calculate_fee(timer[start]));
} else {
lcd_show_string(2, 12, " 0");
}
delay_ms(50);
|